package com.raising.modules.sys.utils;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.raising.framework.entity.JsonMapper;
import com.raising.framework.spring.SpringUtils;
import com.raising.modules.sys.dao.DictItemDao;
import com.raising.modules.sys.entity.DictItem;
import com.raising.utils.Constants;
import com.raising.utils.JCacheUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.Map;

/**
 * 字典工具类
 *
 * @author gaoy
 * @version 1.0
 */
public class DictUtils {

    private static DictItemDao dictItemDao = SpringUtils.getBean(DictItemDao.class);

    public static final String CACHE_DICT_MAP = "dictMap";

    /**
     * 获取标签
     * @author gaoy
     * @param value
     * @param dictValue
     * @param defaultValue
     * @return
     */
    public static String getDictLabel(String value, String dictValue, String defaultValue) {
        if (StringUtils.isNotBlank(dictValue) && StringUtils.isNotBlank(value)) {
            for (DictItem dict : getDictList(dictValue)) {
                if (dictValue.equals(dict.getDictValue()) && value.equals(dict.getValue())) {
                    return dict.getLabel();
                }
            }
        }
        return defaultValue;
    }

    /**
     * 获取字典标签(多个)
     * @author gaoy
     * @param values
     * @param dictValue
     * @param defaultValue
     * @return
     */
    public static String getDictLabels(String values, String dictValue, String defaultValue) {
        if (StringUtils.isNotBlank(dictValue) && StringUtils.isNotBlank(values)) {
            List<String> valueList = Lists.newArrayList();
            for (String value : StringUtils.split(values, Constants.JAVA_COMMA)) {
                valueList.add(getDictLabel(value, dictValue, defaultValue));
            }
            return StringUtils.join(valueList, ",");
        }
        return defaultValue;
    }

    /**
     * 获取字典值
     * @author gaoy
     * @param label
     * @param dictValue
     * @param defaultLabel
     * @return
     */
    public static String getDictValue(String label, String dictValue, String defaultLabel) {
        if (StringUtils.isNotBlank(dictValue) && StringUtils.isNotBlank(label)) {
            for (DictItem dictItem : getDictList(dictValue)) {
                if (dictValue.equals(dictItem.getDictValue()) && label.equals(dictItem.getLabel())) {
                    return dictItem.getValue();
                }
            }
        }
        return defaultLabel;
    }

    /**
     * 获取字典对象列表
     * @author gaoy
     * @param dictValue
     * @return
     */
    public static List<DictItem> getDictList(String dictValue) {
        @SuppressWarnings("unchecked")
		Map<String, List<DictItem>> dictMap = (Map<String, List<DictItem>>) JCacheUtils.get(CACHE_DICT_MAP);
        if (dictMap == null) {
            dictMap = Maps.newHashMap();
            for (DictItem dictItem : dictItemDao.getList(null)) {
                List<DictItem> dictItemList = dictMap.get(dictItem.getDictValue());
                if (dictItemList != null) {
                	dictItemList.add(dictItem);
                } else {
                    dictMap.put(dictItem.getDictValue(), Lists.newArrayList(dictItem));
                }
            }
            JCacheUtils.put(CACHE_DICT_MAP, dictMap);
        }
        List<DictItem> dictItemList = dictMap.get(dictValue);
        if (dictItemList == null) {
        	dictItemList = Lists.newArrayList();
        }
        return dictItemList;
    }

    /**
     * 返回字典列表（JSON）
     * @author gaoy
     * @param dictValue
     * @return
     */
    public static String getDictListJson(String dictValue) {
        return JsonMapper.toJsonString(getDictList(dictValue));
    }

}
